#ifndef PROJECT_VIEW_NODE_EVENT_H
#define PROJECT_VIEW_NODE_EVENT_H

#include <list>
#include <wx/string.h>
#include <boost/shared_ptr.hpp>
#include "UtilEvent.h"

namespace model {

class INode;
typedef boost::shared_ptr<INode> NodePtr;
typedef std::list<NodePtr> NodePtrs;

class ParentAndChild
{
public:

    //////////////////////////////////////////////////////////////////////////
    // INITIALIZATION
    //////////////////////////////////////////////////////////////////////////

    ParentAndChild(NodePtr parent, NodePtr child);

    //////////////////////////////////////////////////////////////////////////
    // GET/SET
    //////////////////////////////////////////////////////////////////////////

    NodePtr getParent() const;
    NodePtr getChild() const;

private:

    //////////////////////////////////////////////////////////////////////////
    // MEMBERS
    //////////////////////////////////////////////////////////////////////////

    NodePtr mParent;
    NodePtr mChild;

    //////////////////////////////////////////////////////////////////////////
    // LOGGING
    //////////////////////////////////////////////////////////////////////////

    friend std::ostream& operator<<( std::ostream& os, const ParentAndChild& obj );

};

DECLARE_EVENT(EVENT_ADD_NODE,      EventAddNode,      ParentAndChild);
DECLARE_EVENT(EVENT_REMOVE_NODE,   EventRemoveNode,   ParentAndChild);

class NodeWithNewName
{
public:

    //////////////////////////////////////////////////////////////////////////
    // INITIALIZATION
    //////////////////////////////////////////////////////////////////////////

    NodeWithNewName( NodePtr node, wxString name);

    //////////////////////////////////////////////////////////////////////////
    // GET/SET
    //////////////////////////////////////////////////////////////////////////

    NodePtr getNode() const;
    wxString getName() const;

private:

    //////////////////////////////////////////////////////////////////////////
    // MEMBERS
    //////////////////////////////////////////////////////////////////////////

    NodePtr mNode;
    wxString mName;

    //////////////////////////////////////////////////////////////////////////
    // LOGGING
    //////////////////////////////////////////////////////////////////////////

    friend std::ostream& operator<<( std::ostream& os, const NodeWithNewName& obj );

};

DECLARE_EVENT(EVENT_RENAME_NODE,   EventRenameNode,   NodeWithNewName);

} // namespace

#endif // PROJECT_VIEW_NODE_EVENT_H
